package dao;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;

import bo.Fornecedor;
import exception.DataException;
import exception.DatabaseConnectException;
import exception.EmptyResultException;

public class FornecedorDAO {

	public ArrayList<Fornecedor> consultaTodosRegistros() throws DataException,
			EmptyResultException, SQLException, DatabaseConnectException {

		ArrayList<Fornecedor> fornecedores = null;

		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"SELECT fornecedor.id, fornecedor.ds_fornecedor, fornecedor.contato, fornecedor.telefone, fornecedor.dt_atualizacao "
									+ "FROM fornecedor ORDER BY fornecedor.id;");

			resultSet = preparedStatement.executeQuery();

			fornecedores = new ArrayList<Fornecedor>();
			while (resultSet.next()) {
				Fornecedor fornecedor = new Fornecedor();
				fornecedor.setId(resultSet.getInt(1));
				fornecedor.setDescricao(resultSet.getString(2));
				fornecedor.setContato(resultSet.getString(3));
				fornecedor.setTelefone(resultSet.getString(4));
				fornecedor.setAtualizacao(resultSet.getDate(5));
				fornecedores.add(fornecedor);
			}

			if (fornecedores.isEmpty()) {
				throw new EmptyResultException();
			}

		} catch (SQLException e) {
			throw new DataException(e, DataException.SELECT);
		} finally {
			preparedStatement.close();
			resultSet.close();
		}

		return fornecedores;

	}

	public ArrayList<Fornecedor> consultaPorId(Integer id)
			throws DatabaseConnectException, DataException, SQLException,
			EmptyResultException {

		ArrayList<Fornecedor> fornecedores = null;
		ResultSet resultSet = null;
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"SELECT fornecedor.id, fornecedor.ds_fornecedor, fornecedor.contato, fornecedor.telefone, fornecedor.dt_atualizacao "
									+ "FROM fornecedor WHERE fornecedor.id = ? ORDER BY fornecedor.id");

			preparedStatement.setInt(1, id);
			resultSet = preparedStatement.executeQuery();

			fornecedores = new ArrayList<Fornecedor>();
			while (resultSet.next()) {
				Fornecedor fornecedor = new Fornecedor();
				fornecedor.setId(resultSet.getInt(1));
				fornecedor.setDescricao(resultSet.getString(2));
				fornecedor.setContato(resultSet.getString(3));
				fornecedor.setTelefone(resultSet.getString(4));
				fornecedor.setAtualizacao(resultSet.getDate(5));
				fornecedores.add(fornecedor);
			}

			if (fornecedores.isEmpty()) {
				throw new EmptyResultException();
			}

		} catch (SQLException e) {
			throw new DataException(e, DataException.SELECT);
		} finally {
			preparedStatement.close();
			resultSet.close();
		}

		return fornecedores;
	}

	public ArrayList<Fornecedor> consultaPorDescricao(String descricao)
			throws DatabaseConnectException, DataException, SQLException,
			EmptyResultException {

		ArrayList<Fornecedor> fornecedores = null;
		ResultSet resultSet = null;
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"SELECT fornecedor.id, fornecedor.ds_fornecedor, fornecedor.dt_atualizacao, fornecedor.contato, fornecedor.telefone "
									+ "FROM fornecedor WHERE fornecedor.ds_fornecedor = ? ORDER BY fornecedor.ds_fornecedor");

			preparedStatement.setString(1, descricao);
			resultSet = preparedStatement.executeQuery();

			fornecedores = new ArrayList<Fornecedor>();
			while (resultSet.next()) {
				Fornecedor fornecedor = new Fornecedor();
				fornecedor.setId(resultSet.getInt(1));
				fornecedor.setDescricao(resultSet.getString(2));
				fornecedor.setContato(resultSet.getString(3));
				fornecedor.setTelefone(resultSet.getString(4));
				fornecedor.setAtualizacao(resultSet.getDate(5));
				fornecedores.add(fornecedor);
			}

			if (fornecedores.isEmpty()) {
				throw new EmptyResultException();
			}

		} catch (SQLException e) {
			throw new DataException(e, DataException.SELECT);
		} finally {
			preparedStatement.close();
			resultSet.close();
		}

		return fornecedores;
	}

	public ArrayList<Fornecedor> consultaPorContato(String contato)
			throws DatabaseConnectException, DataException, SQLException,
			EmptyResultException {

		ArrayList<Fornecedor> fornecedores = null;
		ResultSet resultSet = null;
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"SELECT fornecedor.id, fornecedor.ds_fornecedor, fornecedor.dt_atualizacao, fornecedor.contato, fornecedor.telefone "
									+ "FROM fornecedor WHERE fornecedor.contato = ? ORDER BY fornecedor.contato");

			preparedStatement.setString(1, contato);
			resultSet = preparedStatement.executeQuery();

			fornecedores = new ArrayList<Fornecedor>();
			while (resultSet.next()) {
				Fornecedor fornecedor = new Fornecedor();
				fornecedor.setId(resultSet.getInt(1));
				fornecedor.setDescricao(resultSet.getString(2));
				fornecedor.setContato(resultSet.getString(3));
				fornecedor.setTelefone(resultSet.getString(4));
				fornecedor.setAtualizacao(resultSet.getDate(5));
				fornecedores.add(fornecedor);
			}

			if (fornecedores.isEmpty()) {
				throw new EmptyResultException();
			}

		} catch (SQLException e) {
			throw new DataException(e, DataException.SELECT);
		} finally {
			preparedStatement.close();
			resultSet.close();
		}

		return fornecedores;
	}

	public void incluir(Fornecedor fornecedor) throws DataException,
			DatabaseConnectException {
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"INSERT INTO fornecedor (id, ds_fornecedor, dt_atualizacao, contato, telefone)"
									+ " VALUES (nextval('seqfornecedor'), ?, ?, ?, ?)");
			preparedStatement.setString(1, fornecedor.getDescricao());
			if (fornecedor.getAtualizacao() != null) {
				preparedStatement.setDate(2, new Date(fornecedor
						.getAtualizacao().getTime()));
			} else {
				preparedStatement.setNull(2, Types.DATE);
			}
			preparedStatement.setString(3, fornecedor.getContato());
			preparedStatement.setString(4, fornecedor.getTelefone());

			preparedStatement.executeUpdate();

		} catch (SQLException e) {
			throw new DataException(e, DataException.INSERT);
		}
	}

	public void alterar(Fornecedor fornecedor) throws DataException,
			DatabaseConnectException {
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"UPDATE fornecedor "
									+ "SET ds_fornecedor = ?, dt_atualizacao = ?, contato = ?, telefone = ?"
									+ " WHERE fornecedor.id = ?");

			preparedStatement.setString(1, fornecedor.getDescricao());
			if (fornecedor.getAtualizacao() != null) {
				preparedStatement.setDate(2, new Date(fornecedor
						.getAtualizacao().getTime()));
			} else {
				preparedStatement.setNull(2, Types.DATE);
			}
			preparedStatement.setString(3, fornecedor.getContato());
			preparedStatement.setString(4, fornecedor.getTelefone());
			preparedStatement.setInt(5, fornecedor.getId());

			preparedStatement.executeUpdate();

		} catch (SQLException e) {
			throw new DataException(e, DataException.UPDATE);
		}
	}

	public void excluir(Integer id) throws DataException,
			DatabaseConnectException {
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"DELETE FROM fornecedor WHERE fornecedor.id = ?");
			preparedStatement.setInt(1, id);

			preparedStatement.executeUpdate();

		} catch (SQLException e) {
			throw new DataException(e, DataException.DELETE);
		}
	}

}
